#include "board.h"
#include "stm32f4xx.h"
#include "OLED.h"
#include "debug.h"
#include "semphr.h"

typedef enum
{
    notify_ad_singgle_scan = 0x01,
    notify_ad_continue_scan,
}ad_cm_t;

SemaphoreHandle_t key_to_oled_ctr_wfi;

void key_task(void* param)
{
    key_init();
    key_to_oled_ctr_wfi = xSemaphoreCreateBinary(); // 通知oled显示当前是否处于低功耗模式

    while(1)
    {
        if(key_press(key1))
        {
            // 向ad转换任务发送仅需单次转换命令
            xTaskNotify(adc_task_handle, (uint32_t)notify_ad_singgle_scan, eSetValueWithOverwrite);
            // 释放用户操作的信号量  告知CPU当前有用户操作  防止误进入低功耗模式
            xSemaphoreGive(wfi_wait_user_binary);
        }
        if(key_press(key2))
        {
            // 向ad转换任务发送需连续转换命令(500tick转换一次)
            xTaskNotify(adc_task_handle, (uint32_t)notify_ad_continue_scan, eSetValueWithOverwrite);
            // 释放用户操作的信号量
            xSemaphoreGive(wfi_wait_user_binary);
        }
        if(key_press(key3))
        {
            if(eTaskGetState(wfi_task_handle) != eSuspended) // 挂起低功耗任务
                vTaskSuspend(wfi_task_handle);
            if(eTaskGetState(warning_task_handle) == eSuspended) // 解挂正常模式下监测任务
                vTaskResume(warning_task_handle);
            xSemaphoreGive(key_to_oled_ctr_wfi);
            // 释放用户操作的信号量
            xSemaphoreGive(wfi_wait_user_binary);
        }
        if(key_press(key4))
        {
            if(eTaskGetState(wfi_task_handle) == eSuspended) // 恢复低功耗任务
                vTaskResume(wfi_task_handle);
            if(eTaskGetState(warning_task_handle) != eSuspended) // 挂起正常模式下监测任务
                vTaskSuspend(warning_task_handle);
            xSemaphoreGive(key_to_oled_ctr_wfi);
            // 释放用户操作的信号量
            xSemaphoreGive(wfi_wait_user_binary);
        }

        vTaskDelay(10);
    }
}
